﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Finisar.SQLite;
using System.Collections;

namespace LP1415
{
      /// <summary>
      /// Abre o ficheiro DB criado passa os valores para lista 
      /// e mostra o seu grafico e a sua estatistica
     ///</summary> 
    public partial class mostraEstat : Form
    {
        /// <summary>
        /// cria as listas de cada tabela, as 2 listas temporarias, e os anos consoante o intervalo de anos
        /// escolhido</summary>
        ArrayList ano = new ArrayList();
        ArrayList ipc = new ArrayList();
        ArrayList txI = new ArrayList();
        ArrayList renMin = new ArrayList();
        ArrayList renMax = new ArrayList();
        ArrayList pib = new ArrayList();
        ArrayList renNac = new ArrayList();
        ArrayList renDisp = new ArrayList();
        ArrayList renPerCap = new ArrayList();
        ArrayList evoRenuMin = new ArrayList();
        ArrayList evoRenuMax = new ArrayList();
        ArrayList secondAno = new ArrayList();
        ArrayList pontosGraf = new ArrayList();
        ArrayList tempList = new ArrayList();
        ArrayList tempAno = new ArrayList();
        int ano1;
        int ano2;


        /// <summary>
        /// Abre o ficheiro DB criado passa os valores para lista 
        /// e mostra o seu grafico e a sua estatistica
        ///</summary> 
        public mostraEstat()
        {
            // TODO: Add Constructor Logic here.
            InitializeComponent();
          
        }

        /// <summary>
        ///botao sair do menu
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
      
        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //exit 
            Close();
        }

        /// <summary>
        ///botao about do programa</summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void verAjudaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //help
            MessageBox.Show("Trabalho LP 14/15 Realizado por Bruno Rendeiro & André Simão\n\n");
        }

        /// <summary>
        /// conectar a DB para ir buscar valores
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void criarDB_Click(object sender, EventArgs e)
        {
            ArrayList totil = new ArrayList();
            SQLiteDataReader sqlite_datareader;
            SQLiteConnection sqlite_conn;
            SQLiteCommand sqlite_cmd;
            sqlite_conn = new SQLiteConnection("Data Source=LP1415.db;Version=3;");


            sqlite_cmd = sqlite_conn.CreateCommand();


            sqlite_conn.Open();
            sqlite_cmd.CommandText = "SELECT * FROM dados";

            sqlite_datareader = sqlite_cmd.ExecuteReader();
           
            // meter cada coluna da BD em sua lista
           
            while (sqlite_datareader.Read())
            {

                ano.Add(sqlite_datareader.GetValue(0));
                ipc.Add(sqlite_datareader.GetValue(1));
                txI.Add(sqlite_datareader.GetValue(2));
                renMin.Add(sqlite_datareader.GetValue(3));
                renMax.Add(sqlite_datareader.GetValue(4));
                pib.Add(sqlite_datareader.GetValue(5));
                renNac.Add(sqlite_datareader.GetValue(6));
                renDisp.Add(sqlite_datareader.GetValue(7));
                renPerCap.Add(sqlite_datareader.GetValue(8));
                evoRenuMin.Add(sqlite_datareader.GetValue(9));
                evoRenuMax.Add(sqlite_datareader.GetValue(10));

            }

            comboBox1.DataSource = ano;
            
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {


        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// actualiza a combo box 2 consoante o ano escolhido da primeira combo box
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>

        private void button1_Click(object sender, EventArgs e)
        {

            int temp = 0;
            for (int k = 0; k < ano.Count; k++)
            {
                if (ano[k] == comboBox1.SelectedValue)
                {
                    temp = k;
                    this.ano1 = k;
                   
                }
            }

            for (int i = temp; i < ano.Count; i++)
            {
                secondAno.Add(ano[i]);
            }

            comboBox2.DataSource = secondAno;
        }
        /// <summary>
        /// guarda o segundo valor do intervalo de anos escolhido 
        /// e verifica qual a lista escolhida
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Estatisticas_Click(object sender, EventArgs e)
        {
            
            for (int k = 0; k < ano.Count; k++)
            {
                if (ano[k] == comboBox2.SelectedValue)
                {

                    this.ano2 = k;
                }
            }

            if ((string)comboBox3.SelectedItem == "IPC")
            {
                this.estats(this.ipc);
            }
            else if ((string)comboBox3.SelectedItem == "Variação Anual")
            {
                this.estats(this.txI);
            }
            else if ((string)comboBox3.SelectedItem == "Renumeração Minima Mensal")
            {
                this.estats(renMin);
            }
            else if ((string)comboBox3.SelectedItem == "Renumeração Maxima Mensal")
            {
                this.estats(renMax);
            }
            else if ((string)comboBox3.SelectedItem == "PIB per capita anual")
            {
                this.estats(pib);
            }
            else if ((string)comboBox3.SelectedItem == "Rendimento nacional bruto per capita anual")
            {
                this.estats(renNac);
            }
            else if ((string)comboBox3.SelectedItem == "Rendimento disponível bruto per capita anual")
            {
                this.estats(renDisp);
            }
            else if ((string)comboBox3.SelectedItem == "Remunerações per capita anual")
            {
                this.estats(renPerCap);
            }
            else if ((string)comboBox3.SelectedItem == "Evoluçao Minima")
            {
                this.estats(evoRenuMin);
            }
            else  
            {
                this.estats(evoRenuMax);
            }
           
        }
        ///<summary>
        ///calcula todas as estatisticas conforme a lista escolhida da combo box     
       ///</summary>
        /// <param name="list">arrayList selecionado na comboBox3.</param>
        private void estats(ArrayList list)
        {
            tempList.Clear();
            tempAno.Clear();
            //passar valores para arrays temporarios
            for (int i = this.ano1 ; i <= this.ano2; i++)
            {
                tempList.Add(list[i]);
                tempAno.Add(this.ano[i]);
            }

            this.calcMedia(tempList);
            this.desvioM(tempList);
            this.variancia(tempList);
            this.desvioM(tempList);
            this.Cofvariacao(tempList);
            this.drawGraf(tempList);
        }


        ///<summary>
        ///calculo da media   
        ///</summary>
        /// <param name="list">arrayList selecionado na comboBox3.</param>
        /// <returns>
        /// The method returns an double.
        /// </returns>
        private double calcMedia(ArrayList list)
        {
                 
            //calcula media
            double soma = 0;
            double a = 0;
            double b = 0;
            string str;
            for (int i = 0; i < list.Count; i++)
            {
                str = Convert.ToString(list[i]);
                if ((list[i] != null)&&(str != "")) 
                {

                    b = Convert.ToDouble(list[i]);
                    soma += b;
                    a += 1;
                }
            }

            double media = soma / a;
            mediaTxt.Text = ("" + media);
            return media;

        }
        ///<summary>
        ///calculo do desvio medio  
        ///</summary>
        /// <param name="list">arrayList selecionado na comboBox3.</param>
        /// <returns>
        /// The method returns an double.
        /// </returns>
        private double desvioM(ArrayList list)
        {
            //calcula desvio medio
            double b;
            double mediaX = this.calcMedia(list);
            double k = 0;
            double soma_desvio = 0;
            double a = 0;
            string str;
            for (int i = 0; i < list.Count; i++)
            {
                str = Convert.ToString(list[i]);
                if ((list[i] != null) && (str != ""))
                {
                    b = Convert.ToDouble(list[i]);
                    if (b < mediaX)
                    {
                        a += 1;
                        k = mediaX - b;
                        soma_desvio += k;
                    }
                    else
                    {
                        a += 1;
                        k = b - mediaX;
                        soma_desvio += k;

                    }
                }
            }


            double desvioMedio = soma_desvio / a;
            desvioMTxt.Text = ("" + desvioMedio);
            return desvioMedio;

        }
        ///<summary>
        ///calculo da variancia  
        ///</summary>
        /// <param name="list">arrayList selecionado na comboBox3.</param>
        /// <returns>
        /// The method returns an double.
        /// </returns>
        private double variancia(ArrayList list)
        {
            //calcula variancia
            double var=0;
            double soma_media=0.0;
	        double soma_quad=0.0;
	        double a=0; 
            double b;
            string str;
            for (int i = 0; i < list.Count; i++)
            {
                str = Convert.ToString(list[i]);
                if ((list[i] != null) && (str != ""))
                {
             b = Convert.ToDouble(list[i]);
                 a+=1;
	        		soma_media+=b;
			soma_quad+=b *b;
            }
            }

	        var+=((soma_quad -((soma_media *soma_media)/a))/(a-1));
            varianciaTxt.Text = ("" + var);
            return var;
        }
        ///<summary>
        ///calculo do desvio padrao 
        ///</summary>
        /// <param name="list">arrayList selecionado na comboBox3.</param>
        /// <returns>
        /// The method returns an double.
        /// </returns>
         private double desvioPad(ArrayList list)
        {
            //calcula desvio padrao
	      double var=this.variancia(list);
          double desvPa = Math.Sqrt(var);
          desvioPTxt.Text = ("" + desvPa);
          return desvPa;

         }
         ///<summary>
         ///coeficiente da variacao  
         ///</summary>
         /// <param name="list">arrayList selecionado na comboBox3.</param>
         /// <returns>
         /// The method returns an double.
         /// </returns>
        private double Cofvariacao(ArrayList list)
         {
             //calcula coeficiente da variaçao
	         double a=this.calcMedia(list);
	         double b=this.desvioPad(list);
            double cof=((b/a)*100);
            coeficienteTxt.Text = ("" + cof);
            return cof;
         }


        ///<summary>
        ///abre uma nova form com o grafico da lista desejada
        ///</summary>
        /// <param name="list">arrayList selecionado na comboBox3.</param>
        private void drawGraf(ArrayList list)
        {
               
            grafico grafForm = new grafico(tempAno,tempList, (string)comboBox3.SelectedItem);
            grafForm.Location = new Point(550, 0);
            grafForm.Show();
    }

       
    } 
}
  
    

